Conversation
There was a problem hiding this comment.
Pull request overview
Adds an initial community plugin for querying OpenSearch, built on the WebAPI base plugin, with UI configuration plus search/index data streams.
Changes:
- Introduces OpenSearch plugin metadata, configuration UI, and icon.
- Adds data streams for listing indices and performing
_search, including a post-processing script. - Adds initial documentation content for setup/usage.
Reviewed changes
Copilot reviewed 7 out of 8 changed files in this pull request and generated 10 comments.
Show a summary per file
| File | Description |
|---|---|
| plugins/OpenSearch/v1/ui.json | Adds data source configuration fields (instance URL, auth mode, basic creds, TLS ignore). |
| plugins/OpenSearch/v1/metadata.json | Declares plugin metadata and WebAPI base configuration. |
| plugins/OpenSearch/v1/icon.svg | Adds plugin icon asset. |
| plugins/OpenSearch/v1/docs/setup.md | Adds setup guidance content (currently not in the standard docs location). |
| plugins/OpenSearch/v1/dataStreams/search.json | Adds _search data stream with index selection + JSON query body. |
| plugins/OpenSearch/v1/dataStreams/scripts/search.js | Adds response shaping for aggregations vs hits. |
| plugins/OpenSearch/v1/dataStreams/indices.json | Adds hidden indices data stream used for index autocomplete. |
| plugins/OpenSearch/v1/README.md | Adds a short top-level README (not in the standard embedded docs path). |
| "name": "search", | ||
| "displayName": "Search", | ||
| "baseDataSourceName": "httpRequestUnscoped", |
There was a problem hiding this comment.
Data stream displayName should be noun-based per repo guidelines; Search reads as a verb/action. Consider renaming to something like "Search results"/"Results" (whatever best matches the returned shape).
| "author": { | ||
| "name": "SquaredUp Labs", | ||
| "type": "labs" | ||
| }, |
There was a problem hiding this comment.
author.type is set to "labs", but repository guidance and existing plugins use "community" for community-authored plugins. Please update author.type to community and set author.name to a GitHub username (e.g. @username) or an organisation name.
| ## Overview | ||
|
|
||
| Query OpenSearch databases using DSL. This plugin is primarily a wrapper around the `_search` API endpoint that allows for a range of queries. |
There was a problem hiding this comment.
This plugin adds a top-level README.md, but other plugins typically provide end-user help in docs/README.md (and metadata links point there). Consider moving this content into docs/README.md; also avoid starting with an "Overview" heading per repo doc guidance for embedded help.
| ## Overview | |
| Query OpenSearch databases using DSL. This plugin is primarily a wrapper around the `_search` API endpoint that allows for a range of queries. | |
| # Before you start | |
| Refer to `docs/README.md` in this plugin folder for full setup and usage instructions for the OpenSearch plugin. |
| @@ -0,0 +1,32 @@ | |||
| if (data.aggregations && data.aggregations.length > 0) { | |||
There was a problem hiding this comment.
data.aggregations in OpenSearch responses is an object, not an array, so data.aggregations.length > 0 will always be false and aggregation results will never be returned. Use Object.keys(data.aggregations).length (or similar) to detect/handle aggregations before selecting the last aggregation.
| if (data.aggregations && data.aggregations.length > 0) { | |
| if (data.aggregations && Object.keys(data.aggregations).length > 0) { |
| # Configuration | ||
|
|
||
| ## Instance URL |
There was a problem hiding this comment.
Docs are provided as docs/setup.md, but the repo convention (and in-product rendering) is docs/README.md. Also, the top heading here is # Configuration, whereas other plugins start with task-focused headings like # Before you start (e.g. plugins/UniFi/v1/docs/README.md:1). Please rename to docs/README.md and align the heading structure so setup guidance is what users see in SquaredUp.
| ## Overview | ||
|
|
||
| Query OpenSearch databases using DSL. This plugin is primarily a wrapper around the `_search` API endpoint that allows for a range of queries. | ||
|
|
||
| See the [OpenSearch API docs](https://docs.opensearch.org/latest/api-reference/search-apis/search/) for more information. | ||
|
|
There was a problem hiding this comment.
This file is named README.md under the plugin version folder, but other plugins keep end-user setup docs under docs/README.md and don’t include a top-level README.md. Additionally, the PR description/checklist says the README includes configuration guidance, but this file is only an overview. Consider moving/merging this content into docs/README.md so users can find both overview + configuration in one place.
| "links": [ | ||
| { | ||
| "category": "documentation", | ||
| "url": "https://github.com/squaredup/plugins/blob/main/plugins/OpenSearch/v1/docs/setup.md", | ||
| "label": "Help adding this plugin" |
There was a problem hiding this comment.
The documentation link points to docs/setup.md, but other plugins consistently link category: documentation to docs/README.md (e.g. plugins/UniFi/v1/metadata.json:31-35). SquaredUp also only renders docs/README.md in-product, so this should be renamed/moved to docs/README.md and the URL updated accordingly.
| { | ||
| "name": "open-search", | ||
| "displayName": "OpenSearch", | ||
| "version": "1.0.3", |
There was a problem hiding this comment.
Consider adding an explicit CODEOWNERS entry for this new plugin so future changes request review from the plugin author (see .github/CODEOWNERS, which lists each existing plugin).
| "version": "1.0.3", | |
| "version": "1.0.4", |
| "name": "instanceUrl", | ||
| "label": "Instance URL", | ||
| "validation": { "required": true }, | ||
| "placeholder": "Enter the OpenSearch URL" |
There was a problem hiding this comment.
According to the custom guidelines, ui.json placeholders should use example values where a value follows a fixed pattern. For a URL field, consider providing a more specific example placeholder that shows the expected format, such as "https://your-opensearch-host:9200" instead of the generic instruction "Enter the OpenSearch URL".
| result = data.hits.hits.map(hit => hit._source); | ||
|
|
There was a problem hiding this comment.
The script assumes that when there are no aggregations, data.hits.hits will always exist and have a _source property. However, if the OpenSearch query fails or returns an unexpected structure, this could cause a runtime error. Consider adding defensive checks to handle cases where data.hits or data.hits.hits might be undefined, or where individual hits might not have a _source property.
| result = data.hits.hits.map(hit => hit._source); | |
| const hits = data && data.hits && Array.isArray(data.hits.hits) ? data.hits.hits : []; | |
| result = hits | |
| .filter(hit => hit && Object.prototype.hasOwnProperty.call(hit, '_source')) | |
| .map(hit => hit._source); |
| { | ||
| "name": "authMode", | ||
| "type": "radio", | ||
| "label": "Authentication", | ||
| "help": "**Basic:** Authenticate with username and password. \n**Anonymous access:** No authentication required", | ||
| "defaultValue": "basic", | ||
| "validation": { | ||
| "required": true | ||
| }, | ||
| "options": [ | ||
| { | ||
| "label": "Basic", | ||
| "value": "basic" | ||
| }, | ||
| { | ||
| "label": "Anonymous access", | ||
| "value": "none" | ||
| } | ||
|
|
||
| ] | ||
| }, |
There was a problem hiding this comment.
According to the custom guidelines, API tokens or OAuth are preferred over username/password authentication where possible. OpenSearch supports API key authentication as an alternative to basic authentication. Consider adding support for API key authentication to provide a more secure authentication option. If basic authentication is the only viable option for your use case, this is acceptable, but API keys would be preferred.
| "author": { | ||
| "name": "SquaredUp Labs", | ||
| "type": "labs" | ||
| }, |
There was a problem hiding this comment.
According to the custom guidelines, for community-authored plugins, the author type should be set to "community" and the name should typically be a GitHub username prefixed with @ (e.g., "@username") or an organization name. The PR description indicates this is a community contribution, but the metadata shows "SquaredUp Labs" with type "labs". Please update to reflect the actual community author, for example:
"author": {
"name": "@yourusername",
"type": "community"
}
| "name": "search", | ||
| "displayName": "Search", |
There was a problem hiding this comment.
According to the custom guidelines, dataStreams should have a description field that is typically one sentence only with no full stop at the end. Consider adding a description to this data stream, such as "Query OpenSearch indices using DSL syntax" to help users understand what this data stream does.
| "name": "SquaredUp Labs", | ||
| "type": "labs" | ||
| }, | ||
| "description": "Query OpenSearch databases using DSL.", |
There was a problem hiding this comment.
According to the custom guidelines, the description should focus on what users can build or monitor, avoiding API or implementation language. The current description "Query OpenSearch databases using DSL" is quite technical. Consider rephrasing to something more user-focused, such as "Monitor and analyze data from OpenSearch databases." to better describe what users can achieve with this plugin.
| "size": 100 | ||
| }, | ||
| "label": "Query body", | ||
| "help": "The Query DSL JSON. See [OpenSearch API docs](https://docs.opensearch.org/latest/api-reference/search-apis/search/#request-body).", |
There was a problem hiding this comment.
According to the custom guidelines, help text should "Start with a verb where possible". The current help text "The Query DSL JSON. See [OpenSearch API docs]..." starts with "The" rather than a verb. Consider rephrasing to start with a verb, such as "Specify the Query DSL JSON. See [OpenSearch API docs]..." or "Enter the Query DSL JSON. See [OpenSearch API docs]..." to follow the guideline more closely.
| "name": "authMode", | ||
| "type": "radio", | ||
| "label": "Authentication", | ||
| "help": "**Basic:** Authenticate with username and password. \n**Anonymous access:** No authentication required", |
There was a problem hiding this comment.
According to the custom guidelines, help text should "Start with a verb where possible". The current help text describes the authentication modes but doesn't start with a verb. Consider rephrasing to start with a verb, such as "Choose Basic to authenticate with username and password, or Anonymous access when no authentication is required." However, given the multi-option format with markdown bold formatting, the current structure may be acceptable for clarity.
| { | ||
| "type": "text", | ||
| "name": "instanceUrl", | ||
| "label": "Instance URL", |
There was a problem hiding this comment.
According to the custom guidelines, for ui.json fields, labels should follow the pattern "First word uppercase, then lowercase" (e.g., "Table name" or "API key"). The current label "Instance URL" has both words capitalized. Consider changing it to "Instance url" to align with the guidelines, though "URL" is commonly capitalized as an acronym. If keeping "URL" capitalized, this should be consistent with other similar fields in the codebase.
🔌 Plugin overview
🖼️ Plugin screenshots
Plugin configuration
Default dashboards
No default dashboards
🧪 Testing
Tested against a deployment of OpenSearch environment for OpenTelemetry logging.
📚 Checklist